home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2007 June / SAN CD 6-2007 CD-ROM 25.iso / pc / Software / AstroGrav_Win / Java / jre1.6.0 / lib / rt.jar / java / text / Bidi.class (.txt) < prev    next >
Encoding:
Java Class File  |  2006-11-29  |  6.0 KB  |  413 lines

  1. package java.text;
  2.  
  3. import java.awt.font.NumericShaper;
  4. import java.awt.font.TextAttribute;
  5. import java.security.AccessController;
  6. import sun.security.action.LoadLibraryAction;
  7. import sun.text.CodePointIterator;
  8.  
  9. public final class Bidi {
  10.    byte dir;
  11.    byte baselevel;
  12.    int length;
  13.    int[] runs;
  14.    int[] cws;
  15.    public static final int DIRECTION_LEFT_TO_RIGHT = 0;
  16.    public static final int DIRECTION_RIGHT_TO_LEFT = 1;
  17.    public static final int DIRECTION_DEFAULT_LEFT_TO_RIGHT = -2;
  18.    public static final int DIRECTION_DEFAULT_RIGHT_TO_LEFT = -1;
  19.    private static final int DIR_MIXED = 2;
  20.    private static final char NUMLEVELS = '>';
  21.    private static final int RMASK = 57378;
  22.  
  23.    public Bidi(String var1, int var2) {
  24.       if (var1 == null) {
  25.          throw new IllegalArgumentException("paragraph is null");
  26.       } else {
  27.          nativeBidiChars(this, var1.toCharArray(), 0, (byte[])null, 0, var1.length(), var2);
  28.       }
  29.    }
  30.  
  31.    public Bidi(AttributedCharacterIterator var1) {
  32.       if (var1 == null) {
  33.          throw new IllegalArgumentException("paragraph is null");
  34.       } else {
  35.          byte var2 = -2;
  36.          byte[] var3 = null;
  37.          int var4 = var1.getBeginIndex();
  38.          int var5 = var1.getEndIndex();
  39.          int var6 = var5 - var4;
  40.          int var7 = 0;
  41.          char[] var8 = new char[var6];
  42.  
  43.          for(char var9 = var1.first(); var9 != '\uffff'; var9 = var1.next()) {
  44.             var8[var7++] = var9;
  45.          }
  46.  
  47.          var1.first();
  48.  
  49.          try {
  50.             Boolean var18 = (Boolean)var1.getAttribute(TextAttribute.RUN_DIRECTION);
  51.             if (var18 != null) {
  52.                if (TextAttribute.RUN_DIRECTION_LTR.equals(var18)) {
  53.                   var2 = 0;
  54.                } else {
  55.                   var2 = 1;
  56.                }
  57.             }
  58.          } catch (ClassCastException var16) {
  59.          }
  60.  
  61.          try {
  62.             NumericShaper var19 = (NumericShaper)var1.getAttribute(TextAttribute.NUMERIC_SHAPING);
  63.             if (var19 != null) {
  64.                var19.shape(var8, 0, var8.length);
  65.             }
  66.          } catch (ClassCastException var15) {
  67.          }
  68.  
  69.          int var20 = var4;
  70.  
  71.          int var11;
  72.          do {
  73.             var1.setIndex(var20);
  74.             Object var10 = var1.getAttribute(TextAttribute.BIDI_EMBEDDING);
  75.             var11 = var1.getRunLimit(TextAttribute.BIDI_EMBEDDING);
  76.             if (var10 != null) {
  77.                try {
  78.                   int var12 = (Integer)var10;
  79.                   if (var12 >= -61 && var12 < 61) {
  80.                      byte var13 = (byte)(var12 < 0 ? -var12 | 128 : var12);
  81.                      if (var3 == null) {
  82.                         var3 = new byte[var6];
  83.                      }
  84.  
  85.                      for(int var14 = var20 - var4; var14 < var11 - var4; ++var14) {
  86.                         var3[var14] = var13;
  87.                      }
  88.                   }
  89.                } catch (ClassCastException var17) {
  90.                }
  91.             }
  92.  
  93.             var20 = var11;
  94.          } while(var11 < var5);
  95.  
  96.          nativeBidiChars(this, var8, 0, var3, 0, var8.length, var2);
  97.       }
  98.    }
  99.  
  100.    public Bidi(char[] var1, int var2, byte[] var3, int var4, int var5, int var6) {
  101.       if (var1 == null) {
  102.          throw new IllegalArgumentException("text is null");
  103.       } else if (var5 < 0) {
  104.          throw new IllegalArgumentException("bad length: " + var5);
  105.       } else if (var2 >= 0 && var5 <= var1.length - var2) {
  106.          if (var3 == null || var4 >= 0 && var5 <= var3.length - var4) {
  107.             if (var3 != null) {
  108.                int var7 = var4;
  109.  
  110.                for(int var8 = var4 + var5; var7 < var8; ++var7) {
  111.                   if (var3[var7] < 0) {
  112.                      byte[] var9 = new byte[var5];
  113.                      System.arraycopy(var3, var4, var9, 0, var5);
  114.  
  115.                      for(int var10 = var7 - var4; var10 < var5; ++var10) {
  116.                         if (var9[var10] < 0) {
  117.                            var9[var10] = (byte)(-var9[var10] | 128);
  118.                         }
  119.                      }
  120.  
  121.                      var3 = var9;
  122.                      var4 = 0;
  123.                      break;
  124.                   }
  125.                }
  126.             }
  127.  
  128.             nativeBidiChars(this, var1, var2, var3, var4, var5, var6);
  129.          } else {
  130.             throw new IllegalArgumentException("bad range: " + var4 + " length: " + var5 + " for embeddings of length: " + var1.length);
  131.          }
  132.       } else {
  133.          throw new IllegalArgumentException("bad range: " + var2 + " length: " + var5 + " for text of length: " + var1.length);
  134.       }
  135.    }
  136.  
  137.    private Bidi(int var1, int var2, int var3, int[] var4, int[] var5) {
  138.       this.reset(var1, var2, var3, var4, var5);
  139.    }
  140.  
  141.    private void reset(int var1, int var2, int var3, int[] var4, int[] var5) {
  142.       this.dir = (byte)var1;
  143.       this.baselevel = (byte)var2;
  144.       this.length = var3;
  145.       this.runs = var4;
  146.       this.cws = var5;
  147.    }
  148.  
  149.    public Bidi createLineBidi(int var1, int var2) {
  150.       if (var1 == 0 && var2 == this.length) {
  151.          return this;
  152.       } else {
  153.          int var3 = var2 - var1;
  154.          if (var1 >= 0 && var2 >= var1 && var2 <= this.length) {
  155.             if (this.runs == null) {
  156.                return new Bidi(this.dir, this.baselevel, var3, (int[])null, (int[])null);
  157.             } else {
  158.                int var4 = -1;
  159.                int[] var5 = null;
  160.                if (this.cws != null) {
  161.                   int var6 = 0;
  162.  
  163.                   for(int var7 = this.cws.length; var6 < var7; ++var6) {
  164.                      if (this.cws[var6] >= var1) {
  165.                         for(var7 = var6; var7 < this.cws.length && this.cws[var7] < var2; ++var7) {
  166.                         }
  167.  
  168.                         for(int var8 = var2 - 1; var7 > var6 && this.cws[var7 - 1] == var8; --var8) {
  169.                            var4 = var8;
  170.                            --var7;
  171.                         }
  172.  
  173.                         if (var4 == var1) {
  174.                            return new Bidi(this.dir, this.baselevel, var3, (int[])null, (int[])null);
  175.                         }
  176.  
  177.                         int var9 = var7 - var6;
  178.                         if (var9 > 0) {
  179.                            var5 = new int[var9];
  180.  
  181.                            for(int var10 = 0; var10 < var9; ++var10) {
  182.                               var5[var10] = this.cws[var6 + var10] - var1;
  183.                            }
  184.                         }
  185.                         break;
  186.                      }
  187.                   }
  188.                }
  189.  
  190.                int[] var14 = null;
  191.                byte var16 = this.baselevel;
  192.                int var17 = var4 == -1 ? var2 : var4;
  193.                int var18 = 0;
  194.                int var19 = this.runs.length;
  195.  
  196.                int var11;
  197.                for(var11 = this.dir; var18 < this.runs.length; var18 += 2) {
  198.                   if (this.runs[var18] > var1) {
  199.                      for(var19 = var18; var19 < this.runs.length && this.runs[var19] < var17; var19 += 2) {
  200.                      }
  201.  
  202.                      if (var19 <= var18 && this.runs[var18 + 1] == this.baselevel) {
  203.                         var11 = (this.runs[var18 + 1] & 1) == 0 ? 0 : 1;
  204.                      } else {
  205.                         var19 += 2;
  206.                         if (var4 != -1 && var19 > var18 && this.runs[var19 - 1] != this.baselevel) {
  207.                            var14 = new int[var19 - var18 + 2];
  208.                            var14[var19 - var18] = var3;
  209.                            var14[var19 - var18 + 1] = this.baselevel;
  210.                         } else {
  211.                            var17 = var2;
  212.                            var14 = new int[var19 - var18];
  213.                         }
  214.  
  215.                         int var12 = 0;
  216.  
  217.                         for(int var13 = var18; var13 < var19; var13 += 2) {
  218.                            var14[var12++] = this.runs[var13] - var1;
  219.                            var14[var12++] = this.runs[var13 + 1];
  220.                         }
  221.  
  222.                         var14[var12 - 2] = var17 - var1;
  223.                      }
  224.                      break;
  225.                   }
  226.                }
  227.  
  228.                return new Bidi(var11, this.baselevel, var3, var14, var5);
  229.             }
  230.          } else {
  231.             throw new IllegalArgumentException("range " + var1 + " to " + var2 + " is invalid for paragraph of length " + this.length);
  232.          }
  233.       }
  234.    }
  235.  
  236.    public boolean isMixed() {
  237.       return this.dir == 2;
  238.    }
  239.  
  240.    public boolean isLeftToRight() {
  241.       return this.dir == 0;
  242.    }
  243.  
  244.    public boolean isRightToLeft() {
  245.       return this.dir == 1;
  246.    }
  247.  
  248.    public int getLength() {
  249.       return this.length;
  250.    }
  251.  
  252.    public boolean baseIsLeftToRight() {
  253.       return (this.baselevel & 1) == 0;
  254.    }
  255.  
  256.    public int getBaseLevel() {
  257.       return this.baselevel;
  258.    }
  259.  
  260.    public int getLevelAt(int var1) {
  261.       if (this.runs != null && var1 >= 0 && var1 < this.length) {
  262.          int var2;
  263.          for(var2 = 0; var1 >= this.runs[var2]; var2 += 2) {
  264.          }
  265.  
  266.          return this.runs[var2 + 1];
  267.       } else {
  268.          return this.baselevel;
  269.       }
  270.    }
  271.  
  272.    public int getRunCount() {
  273.       return this.runs == null ? 1 : this.runs.length / 2;
  274.    }
  275.  
  276.    public int getRunLevel(int var1) {
  277.       return this.runs == null ? this.baselevel : this.runs[var1 * 2 + 1];
  278.    }
  279.  
  280.    public int getRunStart(int var1) {
  281.       return this.runs != null && var1 != 0 ? this.runs[var1 * 2 - 2] : 0;
  282.    }
  283.  
  284.    public int getRunLimit(int var1) {
  285.       return this.runs == null ? this.length : this.runs[var1 * 2];
  286.    }
  287.  
  288.    public static boolean requiresBidi(char[] var0, int var1, int var2) {
  289.       CodePointIterator var3 = CodePointIterator.create(var0, var1, var2);
  290.  
  291.       for(int var4 = var3.next(); var4 != -1; var4 = var3.next()) {
  292.          if (var4 > 1424) {
  293.             int var5 = nativeGetDirectionCode(var4);
  294.             if (('\ue022' & 1 << var5) != 0) {
  295.                return true;
  296.             }
  297.          }
  298.       }
  299.  
  300.       return false;
  301.    }
  302.  
  303.    public static void reorderVisually(byte[] var0, int var1, Object[] var2, int var3, int var4) {
  304.       if (var4 < 0) {
  305.          throw new IllegalArgumentException("count " + var4 + " must be >= 0");
  306.       } else if (var1 >= 0 && var1 + var4 <= var0.length) {
  307.          if (var3 >= 0 && var3 + var4 <= var2.length) {
  308.             byte var5 = 63;
  309.             byte var6 = 0;
  310.             int var7 = var1 + var4;
  311.  
  312.             for(int var8 = var1; var8 < var7; ++var8) {
  313.                byte var9 = var0[var8];
  314.                if (var9 > var6) {
  315.                   var6 = var9;
  316.                }
  317.  
  318.                if ((var9 & 1) != 0 && var9 < var5) {
  319.                   var5 = var9;
  320.                }
  321.             }
  322.  
  323.             label68:
  324.             for(int var13 = var3 - var1; var6 >= var5; --var6) {
  325.                int var14 = var1;
  326.  
  327.                while(true) {
  328.                   while(var14 >= var7 || var0[var14] >= var6) {
  329.                      int var10 = var14++;
  330.                      if (var10 == var7) {
  331.                         continue label68;
  332.                      }
  333.  
  334.                      while(var14 < var7 && var0[var14] >= var6) {
  335.                         ++var14;
  336.                      }
  337.  
  338.                      int var11 = var14 - 1;
  339.                      var10 += var13;
  340.  
  341.                      for(int var16 = var11 + var13; var10 < var16; --var16) {
  342.                         Object var12 = var2[var10];
  343.                         var2[var10] = var2[var16];
  344.                         var2[var16] = var12;
  345.                         ++var10;
  346.                      }
  347.                   }
  348.  
  349.                   ++var14;
  350.                }
  351.             }
  352.  
  353.          } else {
  354.             throw new IllegalArgumentException("objectStart " + var3 + " and count " + var4 + " out of range [0, " + var2.length + "]");
  355.          }
  356.       } else {
  357.          throw new IllegalArgumentException("levelStart " + var1 + " and count " + var4 + " out of range [0, " + var0.length + "]");
  358.       }
  359.    }
  360.  
  361.    private static native int nativeGetDirectionCode(int var0);
  362.  
  363.    private static synchronized native void nativeBidiChars(Bidi var0, char[] var1, int var2, byte[] var3, int var4, int var5, int var6);
  364.  
  365.    public String toString() {
  366.       StringBuffer var1 = new StringBuffer(super.toString());
  367.       var1.append("[dir: " + this.dir);
  368.       var1.append(" baselevel: " + this.baselevel);
  369.       var1.append(" length: " + this.length);
  370.       if (this.runs == null) {
  371.          var1.append(" runs: null");
  372.       } else {
  373.          var1.append(" runs: [");
  374.  
  375.          for(int var2 = 0; var2 < this.runs.length; var2 += 2) {
  376.             if (var2 != 0) {
  377.                var1.append(' ');
  378.             }
  379.  
  380.             var1.append(this.runs[var2]);
  381.             var1.append('/');
  382.             var1.append(this.runs[var2 + 1]);
  383.          }
  384.  
  385.          var1.append(']');
  386.       }
  387.  
  388.       if (this.cws == null) {
  389.          var1.append(" cws: null");
  390.       } else {
  391.          var1.append(" cws: [");
  392.  
  393.          for(int var3 = 0; var3 < this.cws.length; ++var3) {
  394.             if (var3 != 0) {
  395.                var1.append(' ');
  396.             }
  397.  
  398.             var1.append(Integer.toHexString(this.cws[var3]));
  399.          }
  400.  
  401.          var1.append(']');
  402.       }
  403.  
  404.       var1.append(']');
  405.       return var1.toString();
  406.    }
  407.  
  408.    static {
  409.       AccessController.doPrivileged(new LoadLibraryAction("awt"));
  410.       AccessController.doPrivileged(new LoadLibraryAction("fontmanager"));
  411.    }
  412. }
  413.